# 函数作用：代码复用 结构清晰 模块化开发
from fontTools.misc.cython import returns

# def welcome():
#     print('欢迎你来到python')
# welcome()
# welcome()

# 函数的参数
# def order(num,dish): #形参 使用范围只在函数内
#     print(f'你点了{num}份{dish}')
# order(1,'汉堡') # 实参 调用函数时传递的参数
# order(2,'薯条')


# 关键字参数 参数名=值  可以不按定义顺序去传递参数
# def greet(name,gender,age,height):
#     print(f'你的名字是：{name},性别是{gender},年龄:{age},身高:{height}')
# greet('张三','男',18,178) # 位置参数
# greet(name='张三',age=18,height=180,gender='男') # 关键字参数
# # 如果同时使用为止参数和关键字参数 位置参数必须在关键字参数的前面
# greet('张三','男',height=180,age=18)
# # greet(height=180,age=18,'张三','男')  # 会报错
#

# 参数默认值：定义函数时，通过形参名=值的形式 为参数指定一个默认值
# msg为可选参数 ，如果没传就使用默认值 传了就使用传递的值
# 可选参数必须放在所有参数的最后面
# def greet(name,gender,age,height,msg='hello'):
#     print(f'{msg},{name},你的性别是：{gender},年龄:{age},身高:{height}')
#     print(msg)
# # greet('张三','男',18,178,) # 如果不传递msg的值 就使用默认值
# # greet('张三','男',18,178,'你好') # 如果传递 就使用你传递的值
#
# # print() 函数底层给end参数设置的默认值 \n 所以不传递的时候默认会换行 如果传递就使用你传递的值
# print('你好')
# print('你好',end='!!!!!')
# print('你好')

# 可变位置参数
# 定义函数时 可以在形参名前面加* 可以接受任意数量的位置参数 并打包成一个元组

# args只是一个形参名 可以随意更改
# args 中存放的是：函数调用时传入的所有位置实参
# args的数据类型是元组
# def test(*args):
#     print(args)
# test('张三','男',18,178)
# # 定义函数时 在形参前加** 就可以接受任意数量的关键字参数了 并打包成一个字典
# def test2(**args):
#     print(args)
# test2(name='张三',gender='男',age=18,height=180)

# None 表示空值 无值 无意义
# None 的类型是 NoneType
# Node 转为布尔值是 False
# 不能参数学运算 也不能与字符串拼接
# print(type(None))
# print(bool(None))
# if None:
#     print('这条语句不会被执行')

# 嵌套调用
# def test1():
#     print('进入test1函数...')
#     test2()
#     print('退出test1函数...')
# def test2():
#     print('进入test2函数...')
#     test3()
#     print('退出test2函数...')
# def test3():
#     print('进入test3函数...')
#     print('程序执行中....')
#     print('退出test3函数...')
#
# test1()

# 递归调用 函数自己调用自己

# def welcome(n):
#     if n >1:
#         welcome(n-1)
#     print(f'welcome{n}')
# welcome(5)

# 递归的应用
# 某个数的阶乘 5!=5*4*3*2*1
# def factorial(num):
#     if num ==0: # 0的阶乘为1
#         return 1
#     else:
#         return num * factorial(num-1)
#
# #
# num = int(input('请输入你想知道阶乘的数：'))
# result = factorial(num)
# print(result)


# 函数说明文档
# def add(a,b):
#     """
#     这是一个加法函数 接收两个数字 a,b, 返回它们的和
#     :param a: 第一个数字
#     :param b: 第二个数字
#     :return: a+b的结果
#     """
#     return a+b
#
# result = add(1,2)
# print(result)


# 函数案例
# 完成一个健身挑战赛程序

# print('俯卧撑：欢迎来到七天挑战赛（请输入每天的数量）')
# total = 0
# def day(num):
#     print(f'第{num}天：',end='')
#     count = int(input())
#     global total
#     total += count
#     if num<7:
#         day(num + 1)
#     else:
#         # 求平均值
#         def average(num):
#             avg = float(total/num).__round__(1) # 保留一位小数
#             return avg
#         print('俯卧撑：七天挑战结束：')
#         print(f'总数:{total},平均值:{average(num)}')
#         print('恭喜你挑战成功！')
# day(1)


# 标准版
# total=0
# def calc_total(*nums):
#     # 求总的运动量
#     """
#     :param nums:
#     :return: 返回的是nums中所有元素的和
#     """
#     return sum(nums)
#
# # 求平均值
# def calc_ave(total,days=7):
#     # 求平均值
#     """
#     :param total: 总运动量
#     :param days: 挑战的天数 默认是7天
#     :return: 返回的是total除以days的结果 保留一位小数
#     """
#     return total/days
#
# # 判断本次挑战是否成功
# def is_success(total,goal=120):
#     """
#     判断本次挑战是否成功
#     :param total: 总运动量
#     :param goal: 目标运动量 默认是120次
#     :return:
#     """
#     if total >=goal:
#         return '恭喜你挑战成功！'
#     else:
#         return '很遗憾你挑战失败了'
#
# def main(title,duration):
#     print(f'{title},{duration}天挑战赛(请输入每天的数量)')
#     num1=int(input('第1天：'))
#     num2=int(input('第2天：'))
#     num3=int(input('第3天：'))
#     num4=int(input('第4天：'))
#     num5=int(input('第5天：'))
#     num6=int(input('第6天：'))
#     num7=int(input('第7天：'))
#     # 计算总数
#     total  =calc_total(num1,num2,num3,num4,num5,num6,num7)
#     # 计算平均值
#     avg = calc_ave(total)
#     # 判断是否成功
#     result = is_success(total)
#     # 输出结果
#     # print('总数:%d,平均值:%.1f'%(total,avg))
#     print(f'总数:{total},平均值:{avg:.1f}')
#     print(result)
#
# main('仰卧起坐',7)


# 数据容器： 列表 元组 字符串 集合 字典 可以存多个元素
#  列表
# 正索引：0-最大值 0,1,2,3,4,5,6
# 负索引: 从最后一个元素开始 -1,-2,-3,.....-最大值
# 可以根据下标来取出相应的值
# list1 = [1, 2, 3, 4, 5, 6, 7]
# for item in list1:
#     print(item,end=' ')
# print()
# # 正索引
# for i in range(len(list1)):
#     print(list1[i],end=' ')
# print()
# # 负索引
# print(list1[-1],end=' ')
# print(list1[-2],end=' ')
# print(list1[-3],end=' ')
# print(list1[-4],end=' ')
# print(list1[-5],end=' ')
# print(list1[-6],end=' ')
# print(list1[-7],end=' ')


# 嵌套列表
# nums = [1,2,3,['你好','中国'],4,5]
# print(nums[3][1]) # 中国


# # 新增列表
# nums = [1,2,3,4,5,2,1]
# 在尾部添加
# for i in range(4,10):
#     nums.append(i)
# print(nums)

# 在指定下标处添加元素
# nums.insert(2,100)
# print(nums)

# 将可迭代对象中的内容依次取出 追加到列表尾部
# nums.extend("张三")
# nums.extend(range(4,10))
# nums.extend([10,20,30,40])
# print(nums)


# 删除nums中下标为0的元素
# nums.pop(0)
# print(nums)

# 删除列表中第一次出现的指定元素值
# nums.remove(2)
# print(nums)
#
# # 删除列表中所有元素
# nums.clear()
# print(nums)

# 删除指定位置的元素 删除下标为0的元素
# del nums[0]
# print(nums)

# 修改操作 下标
# nums[0] = 100
# print(nums)



# 列表常用方法
# fruits = ['香蕉','橘子','葡萄','苹果','西瓜','葡萄','桃子','葡萄']
# result = fruits.index('葡萄') # 查找元素在列表中第一次出现的下标
# print(result)
# result02 = fruits.count('葡萄') # 查找元素在列表中出现的次数
# print(result02)
# fruits.reverse()  # 翻转列表 会改变原列表 没有返回值
# print(fruits)
#
# # .sort(reverse=布尔值)
# # 如果列表中既有数字又有字符串 使用sort会报错 如果都是字符串 按Unicode编码排序
# nums = [1,2,3,4,5]
# nums.sort()
# print(nums)
# nums.sort(reverse=True) # reverse=True 表示降序排序 默认是False 表示升序
# print(nums)
# 所有的列表方法 都不会进入到里面的列表 只对第一层列表有用


# sorted(数据容器,reverse=布尔值)
# 对容器进行排序 从小到大 不改变元容器
# nums = [7,5,8,4,1,2,3,6]
# result = sorted(nums) # 默认是升序 reverse=False
# print('原列表：',nums)
# print('升序后的列表',result)
# result = sorted(nums,reverse=True) # 降序
# print('原列表：',nums)
# print('降序后的列表:',result)
#
# # len(数据容器) 获取元素中元素的个数
# print(len(nums)) # 8
#
# # max(数据容器) 返回容器中的最大值
# print(max(nums)) # 8
#
# # min(数据容器) 返回容器中的最小值 前面的使用于所有的数据容器
# print(min(nums)) # 1
#
# # sum() 求和 只适用于数值类型的数据容器
# print(sum(nums)) # 36

# 循环遍历
# nums =[1,3,5,7,8,9,10]
# for item in nums:
#     print(item,end=' ')
# print()
# for i in range(0,len(nums)):
#     print(nums[i],end=' ')


# 列表练习
# 实现一个成绩统计程序 可以对多名学生的成绩进行统计和分析
# 用户可以连续输入学生成绩 知道用户输入'结束' 字符串
# 然后显示总人数 最高分 最低分 合格人数 合格率 优秀人数 优秀率 平均分
total = 0; # 人数
max_goal = 0 # 最高分
min_goal=0 #最低分
qualify_count = 0 #合格人数
excellent_count = 0 #优秀人数
ravage = 0 # 平均分
# 声明列表 放成绩
nums = []

while True:
    num = input('请输入学生的成绩：')
    if num =='结束':
        break
    else:
        nums.append(int(num))
# 如果nums中有数据 则开始统计
if nums:
    # 总人数
    total = len(nums)
    # 最高分
    max_goal = max(nums)
    # 最低分
    min_goal = min(nums)
    # 总分数
    count = sum(nums)
    # 平均分 总分数/ 总人数
    ravage = count / total

    for item in nums:
        if item >= 90:
            excellent_count += 1  # 优秀人数加1
            # 优秀率
            excellent_rate = excellent_count / total * 100
        if item >= 60:
            qualify_count += 1  # 合格人数加1
            qualify_rate = qualify_count / total * 100  # 合格率
    #统计信息如下
    print('统计结果如下：')
    print('总人数：', total)
    print('最高分：', max_goal)
    print('最低分：', min_goal)
    print('合格人数：', qualify_count)
    print('合格率：', f'{qualify_rate}%')
    print('优秀人数：', excellent_count)
    print('优秀率：', f'{excellent_rate}%')
    print('平均分：', f'{ravage:.2f}')
else:
    print('您没有输入任何成绩')


























































